Seznam kontaktů z webové služby a jejich zobrazení v tabulce 'rozdělených' kontaktů kontaktů, jak je vidět na snímku obrazovky. Problém je, že dostávám stejné hodnoty značek pro zaškrtávací políčka prvního řádku pro sekci A i pro sekci S. Řadil jsem jedno pole a zobrazoval se v indexovaném zobrazení tabulky. Jak získat různé hodnoty značek v závislosti na indexPath.row bez ohledu na počet zobrazených sekcí. Tady je to, co jsem zkoušel V cellForRowAtIndexPath: UIButton * checkBox; if (UI_USER_INTERFACE_IDIOM () == UIUserInterfaceIdiomPhone) { checkBox = [[UIButton alloc] initWithFrame: CGRectMake (7, 8, 30, 30)]; } jiný { checkBox = [[UIButton alloc] initWithFrame: CGRectMake (15, 13, 30, 30)]; } // int cnt = 0; // for (int i = indexPath.section - 1; i> 0; i--) // { // cnt + = [[objectsForCharacters objectForKey: [arrayOfCharacters objectAtIndex: i]] count]; // arrayOfCharachters má char 'A' až 'Z' //} //checkBox.tag = cnt + indexPath.row; [checkBox setImage: [UIImage imageNamed: @ "checkBox.png"] forState: UIControlStateNormal]; [checkBox addTarget: vlastní akce: @selector (checkBoxClicked :) forControlEvents: UIControlEventTouchUpInside]; [checkBox setTag: indexPath.row]; [cell.contentView addSubview: checkBox]; návratová buňka; } - (void) checkBoxClicked: (id) sender { CGPoint buttonPosition = [odesílatel convertPoint: CGPointZero toView: self.tableViewContact]; NSIndexPath * indexPath = [self.tableViewContact indexPathForRowAtPoint: buttonPosition]; UIButton * tappedButton = (UIButton *) odesílatel; NSLog (@ "Číslo značky =% d", [značka odesílatele]); if ([tappedButton.currentImage isEqual: [UIImage imageNamed: @ "checkBox.png"]])) { [sender setImage: [UIImage imageNamed: @ "checkBoxMarked.png"] forState: UIControlStateNormal]; if (indexPath! = Nil) { NSString * finalIntId = [mutableArrayOfIds objectAtIndex: indexPath.row]; // uložit ID zaškrtávacích polí do mutableArrayOfIds NSLog (@ "Označené zaškrtnuté tlačítko id =% @", finalIntId); [arrayOfIds addObject: finalIntId]; } // NSString * finalIntId = [mutableArrayOfIds objectAtIndex: tappedButton.tag]; // NSString * finalIntId = [mutableArrayOfIds objectAtIndex: indexPath.row]; } jiný { [sender setImage: [UIImage imageNamed: @ "checkBox.png"] forState: UIControlStateNormal]; NSLog (@ "Nezaškrtnuto"); // [arrayOfIds removeObjectAtIndex: tappedButton.tag]; } } - (NSString *) tableView: (UITableView *) tableView titleForHeaderInSection: (NSInteger) sekce { if ([arrayOfCharacters count] == 0) { vrátit se @""; } návrat [NSString stringWithFormat: @ "% @", [arrayOfCharacters objectAtIndex: sekce]]; } - (NSArray *) sectionIndexTitlesForTableView: (UITableView *) tableView { NSArray * toBeReturned = [NSArray arrayWithArray: [@ "A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z | # " componentsSeparatedByString: @ "|"]]; návrat doBeReturned; } - (NSInteger) tableView: (UITableView *) tableView sectionForSectionIndexTitle: (NSString *) název atIndex: (NSInteger) index { Počet NSInteger = 0; pro (znak NSString * v arrayOfCharacter) { if ([znak jeEqualToString: název]) { počet návratů; } count ++; } návrat 0; } - (NSInteger) numberOfSectionsInTableView: (UITableView *) tableView { návrat [arrayOfCharacters count]; // návrat 1; } - (NSInteger) tableView: (UITableView *) tableView numberOfRowsInSection: (NSInteger) sekce { // návrat [počet mutableArray]; return [[objectsForCharacter objectForKey: [arrayOfCharacter objectAtIndex: section]] count]; }
2020-12-07 22:53:57
nastavujete stejnou hodnotu značky pro všechny sekce, které mají stejný řádek. Cesta indexPath má dvě vlastnosti, {sekce, řádek}. Řekněme, že sekce A má dva řádky, pro řádek1 -> indexPath.section = 0, indexPath.row = 0; pro řádek2-> indexPath.section = 0, indexPath.row = 1; Řekněme, že sekce S má dva řádky, pro řádek1 -> indexPath.section = 1, indexPath.row = 0; pro řádek2-> indexPath.section = 1, indexPath.row = 1; Takže pro řádek1 sekce A a řádek1 sekce S nastavujete stejnou hodnotu značky, která je 0. Existuje váš problém. Zkuste nastavit hodnotu značky, jak je uvedeno níže. button.tag = indexPath.section * 1000 + indexPath.row; při načítání sekce a řádku, Sekce NSInteger = (button.tag) / 1000; Řádek NSInteger = (button.tag)% 1000; | Zkuste to... - (UITableViewCell *) tableView: (UITableView *) tableView cellForRowAtIndexPath: (NSIndexPath *) indexPath { statický NSString * CellIdentifier = @ "Buňka"; UITableViewCell * cell = [tableView dequeueReusableCellWithIdentifier: CellIdentifier]; if (cell == nil) { cell = [[UITableViewCell alloc] initWithStyle: UITableViewCellStyleDefault reuseIdentifier: CellIdentifier]; } UIButton * checkBox = [[UIButton alloc] initWithFrame: CGRectMake (280, 10, 50, 44)]; checkBox.backgroundColor = [UIColor oranžová barva]; [checkBox addTarget: self action: @selector (checkBoxClicked: event:) forControlEvents: UIControlEventTouchUpInside]; [checkBox setTag: indexPath.row]; [cell.contentView addSubview: checkBox]; návratová buňka; } - (void) checkBoxClicked: (id) sender event: (id) event { NSSet * touches = [událost allTouches]; UITouch * touch = [dotkne se libovolnéhoObjektu]; CGPoint currentTouchPosition = [touch locationInView: self.tv]; // zde tv je TableView Object NSIndexPath * indexPath = [self.tv indexPathForRowAtPoint: currentTouchPosition]; NSLog (@ "hodnota indePath.section% d, indexPath.row% d", indexPath.section, indexPath.row); } | To se děje proto, že přiřazujete tag tlačítkům NEZÁVISLÉ sekcí. Oba první řádky sekcí A a S mají řádek = 0. takže značka přiřazená k jejich příslušnému tlačítku je 0. Měli byste jim přiřadit odkaz Zachovat odkaz na vaše sekce. Navrhoval bych přiřadit nápovědu přístupnosti s čárkami odděleným formulářem obsahujícím sekci, řádek. A ve vaší metodě - (void) checkBoxClicked: (id) sender { // vybrat řetězec z formuláře odděleného čárkami. 1. je vaše sekce, 2. je řada. } druhou možností je Dělejte, co kdy děláte, a implementujte svou Button metodu takhle. CGPoint buttonPosition = [odesílatel convertPoint: CGPointZero toView: self.tableView]; NSIndexPath * indexPath = [self.tableView indexPathForRowAtPoint: buttonPosition]; if (indexPath! = nil) { ... indexpath.section je vaše sekce, index path.row je váš řádek. } Existuje také třetí možnost. v cellforRowAtIndexpath přiřaďte svému tlačítku název - (UITableViewCell *) tableView: (UITableView *) tableView cellForRowAtIndexPath: (NSIndexPath *) indexPath [btn setTitle: <# Your Row #> forState: UIControlStateDisabled]; [btn setTag <#Your Section #>]; takže při příjmu v metodě tlačítka můžete mít jak sekci (značku), tak řádek (název pro deaktivovaný stav). - (void) checkBoxClicked: (id) sender {[button titleForState: UIControlStateDisabled]; // váš řádek button.tag // your Section} | Zkuste to! V každé sekci můžete znát počet sekcí vpravo, poté přidejte počet jednotlivých řádků. [[fieldTitlesList objectAtIndex: indexPath.section - 1] počet] + indexPath.row Kde fieldTitlesList je pole vašich sekcí. | Přidal jsem následující kód, který vyřešil můj problém NSInteger rowNumber = 0; pro (NSInteger i = 0; i